package ar.uade.edu.fain.ad.common.remote;

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.List;
import java.util.Set;

import ar.uade.edu.fain.ad.common.exception.MesaNoDisponibleException;
import ar.uade.edu.fain.ad.common.exception.PedidoCerradoException;
import ar.uade.edu.fain.ad.common.exception.ProductoNoDisponibleException;
import ar.uade.edu.fain.ad.common.transfer.ComandaVO;
import ar.uade.edu.fain.ad.common.transfer.MesaVO;
import ar.uade.edu.fain.ad.common.transfer.MozoVO;
import ar.uade.edu.fain.ad.common.transfer.PedidoVO;
import ar.uade.edu.fain.ad.common.transfer.SalonVO;
import ar.uade.edu.fain.ad.common.transfer.SectorVO;

public interface SalonServicioRemoto extends Remote {

	/**
	 * CU01. Busca sectores en un salon dado.
	 * @param salonVO
	 * @return
	 * @throws RemoteException
	 */
	public abstract List<SectorVO> buscarSectoresEn(SalonVO salonVO)
			throws RemoteException;
	
	/**
	 * CU01. Busca mesas simples sin pedidos activos.
	 * @param sectorVO
	 * @param cantidadComensales
	 * @return mesas disponibles
	 */	
	public abstract Set<MesaVO> buscarMesasDisponiblesEn(
			SectorVO sectorVO, Integer cantidadComensales) 
			throws RemoteException;
	
	/**
	 * CU01. Abre el pedido, ocupa las mesas.
	 * @param mozoVO
	 * @param mesaVOs
	 * @return el pedido generado
	 * @throws RemoteException
	 * @throws MesaNoDisponibleException
	 */
	public abstract PedidoVO abrirPedido(
			MozoVO mozoVO, Set<MesaVO> mesaVOs) 
			throws RemoteException, MesaNoDisponibleException;
	
	/**
	 * CU02. Agrega comanda al pedido abierto.
	 * @param pedidoVO
	 * @param comandaVO
	 * @throws RemoteException
	 * @throws ProductoNoDisponibleException 
	 * 		si la comanda no se puede agregar por falta de stock
	 */
	public abstract void agregarComanda(
			PedidoVO pedidoVO, ComandaVO comandaVOs)
			throws RemoteException, ProductoNoDisponibleException;
	
	/**
	 * CU03. Mesas con pedidos activos del salon.
	 * @param salonVO
	 * @throws RemoteException
	 */
	public abstract Set<MesaVO> buscarMesasOcupadas(SalonVO salonVO) 
			throws RemoteException;
	
	/**
	 * CU03. Pedidos activos del salon.
	 * @param salonVO
	 * @throws RemoteException
	 */
	public abstract Set<PedidoVO> buscarPedidosActivos(SalonVO salonVO) 
			throws RemoteException;
	
	
	/**
	 * CU03. Cierra pedido, libera mesa y la dispone para facturar.
	 * @param pedidoVO
	 * @throws RemoteException
	 * @throws PedidoCerradoException
	 */
	public abstract void cerrarPedido(PedidoVO pedidoVO) 
			throws PedidoCerradoException, RemoteException;
	
}
